import 'dart:convert';
import 'package:http/http.dart' as http;

/// AI服务提供商枚举
enum AIProvider {
  zhipu,    // 智谱AI
  tongyi,   // 通义千问
  wenxin,   // 文心一言
}

/// AI模型服务 - 支持多个国内AI服务提供商
/// 默认使用智谱AI (GLM)，国内可访问且提供免费额度
class AIModelService {
  static bool _isInitialized = false;
  
  // ============================================
  // AI服务提供商选择
  // ============================================
  // 可选值：AIProvider.zhipu (智谱AI), AIProvider.tongyi (通义千问), AIProvider.wenxin (文心一言)
  // 推荐使用 AIProvider.zhipu (智谱AI)，免费额度充足，国内访问稳定
  static const AIProvider _provider = AIProvider.zhipu;
  
  // ============================================
  // API Key 配置
  // ============================================
  // 智谱AI (GLM) - 推荐，免费额度充足
  // 获取方式：访问 https://open.bigmodel.cn/ 注册账号，创建API Key
  static const String _zhipuApiKey = '58d547a9348d4395935bebfeb8d904b3.gXNOSxF044Y07Pf6';
  
  // 通义千问 (可选)
  // 获取方式：访问 https://dashscope.console.aliyun.com/ 创建API Key
  static const String _tongyiApiKey = 'YOUR_TONGYI_API_KEY_HERE';
  
  // 文心一言 (可选)
  // 获取方式：访问 https://cloud.baidu.com/ 创建API Key
  static const String _wenxinApiKey = 'YOUR_WENXIN_API_KEY_HERE';
  
  // ============================================
  
  // 对话历史记录（用于上下文）
  static final List<Map<String, String>> _conversationHistory = [];
  
  // 最大历史记录数量
  static const int _maxHistoryLength = 20;

  /// 初始化服务
  static Future<void> initialize() async {
    if (_isInitialized) return;
    
    // 检查API Key是否已设置
    String apiKey = _getApiKey();
    if (apiKey.isEmpty || apiKey.contains('YOUR_')) {
      print('警告: 请先设置 ${_provider.name} API Key！');
      print('请在 ai_model_service.dart 文件中设置对应的 API Key');
    }
    
    _isInitialized = true;
  }

  /// 获取当前提供商的API Key
  static String _getApiKey() {
    switch (_provider) {
      case AIProvider.zhipu:
        return _zhipuApiKey;
      case AIProvider.tongyi:
        return _tongyiApiKey;
      case AIProvider.wenxin:
        return _wenxinApiKey;
      default:
        return _zhipuApiKey; // 默认返回智谱AI的key
    }
  }

  /// 生成文本回复
  /// [input] 用户输入
  /// [personality] AI人格设定
  static Future<String> generateTextResponse(
    String input,
    Map<String, dynamic> personality,
  ) async {
    if (!_isInitialized) await initialize();

    String apiKey = _getApiKey();
    
    // 检查API Key
    if (apiKey.isEmpty || apiKey.contains('YOUR_')) {
      return _getApiKeyErrorMessage();
    }

    try {
      // 构建系统提示词（包含人格设定）
      String systemPrompt = _buildSystemPrompt(personality);
      
      // 构建消息列表
      List<Map<String, String>> messages = [];
      
      // 添加历史对话（最近的消息）
      for (var history in _conversationHistory) {
        messages.add(history);
      }
      
      // 添加当前用户消息
      messages.add({'role': 'user', 'content': input});
      
      // 根据提供商调用不同的API
      String response;
      switch (_provider) {
        case AIProvider.zhipu:
          response = await _callZhipuAPI(messages, systemPrompt);
          break;
        case AIProvider.tongyi:
          response = await _callTongyiAPI(messages, systemPrompt);
          break;
        case AIProvider.wenxin:
          response = await _callWenxinAPI(messages, systemPrompt);
          break;
        default:
          response = await _callZhipuAPI(messages, systemPrompt);
          break;
      }
      
      // 更新对话历史
      _conversationHistory.add({'role': 'user', 'content': input});
      _conversationHistory.add({'role': 'assistant', 'content': response});
      
      // 保持历史记录在合理范围内
      if (_conversationHistory.length > _maxHistoryLength) {
        _conversationHistory.removeRange(0, _conversationHistory.length - _maxHistoryLength);
      }
      
      return response;
    } catch (e) {
      print('AI API调用错误: $e');
      return '抱歉，AI服务暂时不可用。错误信息: $e';
    }
  }

  /// 获取API Key错误提示信息
  static String _getApiKeyErrorMessage() {
    switch (_provider) {
      case AIProvider.zhipu:
        return '请先配置智谱AI API Key。\n\n'
            '获取方式：\n'
            '1. 访问 https://open.bigmodel.cn/\n'
            '2. 注册/登录账号\n'
            '3. 创建API Key\n'
            '4. 在 ai_model_service.dart 中设置 _zhipuApiKey\n\n'
            '智谱AI提供免费额度，国内访问稳定！';
      case AIProvider.tongyi:
        return '请先配置通义千问 API Key。\n\n'
            '获取方式：访问 https://dashscope.console.aliyun.com/';
      case AIProvider.wenxin:
        return '请先配置文心一言 API Key。\n\n'
            '获取方式：访问 https://cloud.baidu.com/';
      default:
        return '请先配置API Key';
    }
  }

  /// 构建系统提示词
  static String _buildSystemPrompt(Map<String, dynamic> personality) {
    String prompt = '你是一个友好的AI助手。';
    
    // 添加人格特征
    double friendliness = personality['友好度'] ?? 0.5;
    double professionalism = personality['专业度'] ?? 0.5;
    double humor = personality['幽默感'] ?? 0.5;
    
    if (friendliness > 0.7) {
      prompt += '你非常友好和热情，总是用温暖的语言与用户交流。';
    } else if (friendliness < 0.3) {
      prompt += '你保持专业和正式的语气。';
    }
    
    if (professionalism > 0.7) {
      prompt += '你具有很高的专业水平，能够提供准确和专业的建议。';
    }
    
    if (humor > 0.7) {
      prompt += '你具有幽默感，可以在适当的时候使用幽默来活跃气氛。';
    }
    
    prompt += '\n请用中文回复用户的问题，保持自然和流畅的对话。';
    
    return prompt;
  }

  /// 调用智谱AI API (GLM)
  static Future<String> _callZhipuAPI(
    List<Map<String, String>> messages,
    String systemPrompt,
  ) async {
    final apiKey = _getApiKey();
    final url = 'https://open.bigmodel.cn/api/paas/v4/chat/completions';
    
    final headers = {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer $apiKey',
    };

    // 将系统提示词添加到消息列表开头
    final requestMessages = [
      {'role': 'system', 'content': systemPrompt},
      ...messages,
    ];

    final body = jsonEncode({
      'model': 'glm-4', // 可以使用 glm-4, glm-3-turbo 等
      'messages': requestMessages,
      'temperature': 0.7,
      'max_tokens': 2000,
    });

    try {
      final response = await http.post(
        Uri.parse(url),
        headers: headers,
        body: body,
      ).timeout(
        const Duration(seconds: 30),
        onTimeout: () {
          throw Exception('请求超时，请检查网络连接');
        },
      );

      if (response.statusCode == 200) {
        final data = jsonDecode(response.body);
        final content = data['choices'][0]['message']['content'] as String;
        return content.trim();
      } else {
        final errorData = jsonDecode(response.body);
        final errorMessage = errorData['error']?['message'] ?? 
                           errorData['message'] ?? 
                           '未知错误';
        throw Exception('API错误 (${response.statusCode}): $errorMessage');
      }
    } catch (e) {
      if (e is Exception && e.toString().contains('timeout')) {
        rethrow;
      }
      throw Exception('网络请求失败: $e');
    }
  }

  /// 调用通义千问 API
  static Future<String> _callTongyiAPI(
    List<Map<String, String>> messages,
    String systemPrompt,
  ) async {
    final apiKey = _getApiKey();
    final url = 'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation';
    
    final headers = {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer $apiKey',
    };

    final requestMessages = [
      {'role': 'system', 'content': systemPrompt},
      ...messages,
    ];

    final body = jsonEncode({
      'model': 'qwen-turbo', // 可以使用 qwen-plus, qwen-max 等
      'input': {
        'messages': requestMessages,
      },
      'parameters': {
        'temperature': 0.7,
        'max_tokens': 2000,
      },
    });

    try {
      final response = await http.post(
        Uri.parse(url),
        headers: headers,
        body: body,
      ).timeout(const Duration(seconds: 30));

      if (response.statusCode == 200) {
        final data = jsonDecode(response.body);
        final content = data['output']['choices'][0]['message']['content'] as String;
        return content.trim();
      } else {
        final errorData = jsonDecode(response.body);
        final errorMessage = errorData['message'] ?? '未知错误';
        throw Exception('API错误 (${response.statusCode}): $errorMessage');
      }
    } catch (e) {
      throw Exception('网络请求失败: $e');
    }
  }

  /// 调用文心一言 API
  static Future<String> _callWenxinAPI(
    List<Map<String, String>> messages,
    String systemPrompt,
  ) async {
    // 文心一言API需要access_token，实现较复杂
    // 这里提供一个基础框架，实际使用时需要先获取access_token
    throw Exception('文心一言API需要额外的access_token获取步骤，建议使用智谱AI或通义千问');
  }

  /// 清除对话历史
  static void clearHistory() {
    _conversationHistory.clear();
  }

  /// 生成图片（智谱AI支持图片生成）
  static Future<String> generateImage(String prompt) async {
    String apiKey = _getApiKey();
    
    if (apiKey.isEmpty || apiKey.contains('YOUR_')) {
      throw Exception('请先配置API Key');
    }

    // 智谱AI目前不直接支持图片生成
    // 可以使用其他服务如通义千问的图片生成功能
    throw Exception('图片生成功能暂未实现。可以考虑使用通义千问的图片生成API。');
  }

  /// 生成视频（目前不支持）
  static Future<String> generateVideo(String prompt) async {
    throw Exception('视频生成功能暂未实现。');
  }

  /// 释放资源
  static void dispose() {
    _isInitialized = false;
    _conversationHistory.clear();
  }
}
